package com.own.component.springdoc.base;

import com.own.component.springdoc.config.OpenApiConfig;
import com.own.component.springdoc.property.SwaggerProperty;
import lombok.extern.slf4j.Slf4j;
import org.springdoc.core.GroupedOpenApi;
import org.springframework.boot.SpringBootConfiguration;

import javax.annotation.Resource;

/**
 * BaseSpringDocConfiguration
 *
 * @author chenxueli
 * @date 2023-12-05 16:35:00
 */
@Slf4j
@SpringBootConfiguration
public abstract class BaseSpringDocConfiguration {

    @Resource
    private OpenApiConfig openApiConfig;
    @Resource
    private SwaggerProperty swaggerProperty;

    /**
     * 获取springdoc的分组信息
     *
     * @param groupName      分组名称
     * @param moduleName     模块名称
     * @param packagesToScan 扫描的包
     * @return 分组文档信息
     */
    public GroupedOpenApi create(
            String groupName,
            String moduleName,
            String... packagesToScan
    ) {
        return create(groupName, moduleName, false, packagesToScan);
    }

    /**
     * 获取springdoc的分组信息
     *
     * @param groupName      分组名称
     * @param moduleName     模块名称
     * @param defaultEnable  默认的开启状态
     * @param packagesToScan 扫描的包
     * @return 分组文档信息
     */
    public GroupedOpenApi create(
            String groupName,
            String moduleName,
            boolean defaultEnable,
            String... packagesToScan
    ) {
        var switchName = moduleName.replace(".", "_");
        // 判断是否开启springdoc
        var flag = checkEnable(switchName, defaultEnable);
        if (flag) {
            log.debug("SpringDoc Is Open => (GroupName: {}, SwitchName: {})", groupName, switchName);
        }
        return flag ? defaultCreate(groupName, packagesToScan) : null;
    }

    /**
     * 创建的springdoc信息
     *
     * @param groupName      分组名称
     * @param packagesToScan 扫描的包
     * @return 分组文档信息
     */
    protected abstract GroupedOpenApi defaultCreate(String groupName, String... packagesToScan);

    /**
     * 检查是否开启
     *
     * @return 是否开启
     */
    public boolean checkEnable(String moduleName, boolean defaultEnable) {
        // 是否开启swagger（全局开关）
        var enable = swaggerProperty.getEnable();
        if (!enable) {
            return false;
        }
        return switch (swaggerProperty.getShowPolicy()) {
            case DEFAULT -> defaultEnable;
            case ALL_SHOW -> true;
            case ALL_HIDE -> false;
            case PART_SHOW -> swaggerProperty.getModule().contains(moduleName);
            case PART_HIDE -> !swaggerProperty.getModule().contains(moduleName);
        };
    }

}
